#include <iostream>
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>

/*
    同步日志记录器，向标准输出、文件输出日志
    一个线程即完成任务，也完成日志的刷新（当满足刷新策略的时候才会刷新）
    同步可能会导致任务阻塞，适用于低频少量的日志，实时性比较好
*/

int main()
{
    // ***全局函数***
    // 设置日志全局策略
    // 1、设置刷新时间（每间隔一定的时间刷新一下缓冲区）
    spdlog::flush_every(std::chrono::seconds(5)); //如果不设置则无效，仅看flush_on策略

    // 2、设置日志等级（高于此级别的日志才会被记录） -- 每个日志记录器都可以独立设置
    spdlog::set_level(spdlog::level::level_enum::debug);

    // 3、设置刷新等级（高于此级别的日志会立刻被刷新到目标中）-- 每个日志记录器都可以独立设置
    // flush_every和flush_on两个刷新策略只要满足其中任何一个都刷新，向标准输出好像flush_every好像没有用
    spdlog::flush_on(spdlog::level::level_enum::debug);

    // ***日志记录器输出日志***
    // 1.1、定义一个向标准输出输出的同步日志记录器 -- 由工厂类产生（工厂设计模式，优势：调整代码时，可以避免过多修改）
    std::shared_ptr<spdlog::logger> sync_logger = spdlog::stdout_color_mt("stdout-logger"); // mt指的是多线程，st指的是单线程
    // 1.2、定义一个向文件输出的同步日志记录器
    // std::shared_ptr<spdlog::logger> sync_logger = spdlog::basic_logger_mt("basefile-logger", "sync.log", false); // mt指的是多线程，st指的是单线程

    // 2、设置日志记录器的刷新策略
    sync_logger->set_level(spdlog::level::level_enum::debug);
    sync_logger->flush_on(spdlog::level::level_enum::err);

    // 3、设置日志输出格式
    sync_logger->set_pattern("[%n][%H:%m:%S][%t][%-8l]: %v"); // n:日志记录器名称，t:线程名称，l:日志等级名称，v:日志内容

    // 4、日志的输出
    sync_logger->trace("你好：{}", "小明"); // 格式控制部分类型，统一用{}，自定义格式不支持解析
    sync_logger->debug("你好：{}", "小明");
    sync_logger->info("你好：{}", "小明");
    sync_logger->warn("你好：{}", "小明");
    sync_logger->error("你好：{}", "小明");
    sync_logger->critical("你好：{}", "小明");
    std::cout << "日志打印结束\n";

    return 0;
}